"""
Redis String 方法封装
"""

from db_base.redis_db import (
    modify_name_prefix,
    name_add_prefix,
)
from db_base.redis_db.client import redis_client
from my_typing import *

ValueType = bytes | float | int | str


class String:
    """ 字符串 """

    @staticmethod
    @modify_name_prefix
    def set(
        name: str,
        value: ValueType,
        **kwargs,
    ) -> BoolOrNone:
        """
        将键 name 的值设置为 value

        Args:
            name: 键的名称
            value: 值

        Returns:
            bool / None
        """

        return redis_client.set(name, value, **kwargs)

    @staticmethod
    @modify_name_prefix
    def set_ex(
        name: str,
        value: ValueType,
        time_: timedelta | int,
    ) -> BoolOrNone:
        """
        将键 name 的值设置为 value

        Args:
            name: 键的名称
            value: 值
            time_: 过期时间

        Returns:
            bool / None
        """

        return redis_client.setex(name, time_, value)

    @staticmethod
    def set_many(mapping: dict[str, ValueType]) -> BoolOrNone:
        """
        将映射中键 name 的值设置为 value

            - name：必须为非空的字符串
            - value：字符串 or 可以通过 str() 转换为字符串的类型

        Args:
            mapping: 映射

        Returns:
            bool / None
        """

        _mapping: DictStrStr = {
            name_add_prefix(name): value
            for name, value in mapping.items()
        }

        return redis_client.mset(_mapping)

    @staticmethod
    @modify_name_prefix
    def get(name: str) -> StrOrNone:
        """
        返回键 name 的值，如果键不存在则返回 None

        Args:
            name: 键的名称

        Returns:
            bool / None
        """

        return redis_client.get(name)

    @staticmethod
    @modify_name_prefix
    def get_many(
        keys: str | Iterable[str],
        *args: str,
    ) -> list[StrOrNone]:
        """
        返回键 name 的值，如果键不存在则返回 None

        Args:
            keys: 键的名称（可以是单个，也可以是多个）

        Returns:
            键对应的值的列表
        """

        return redis_client.mget(keys, *args)
